#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
//#include <windows.h>

//#define clear() printf("\033[H\033[J")

/// @brief
/// @param val
/// @return
void **********lol();

int menu();

int set_language();

int random_generator(int *lower);

int game_loop();

void set_range_of_values(int *range, int *coefficient);

void set_guessing_tries(int *range,
                        int *coefficient,
                        int *guessing_tries);

void print_hud(int *tries,
               int *rate,
               int left_to_try,
               int *range_val);

int init_game();

void setting_game(int *tries,
                  int *rate,
                  int *left_to_try,
                  int *range_val);

int main() {
    menu();
    return 0;
}

int menu() {
    int menu = 1;
    int ch = 3;
    printf("\033[4m\033[47m\033[31mИ\033[030m\033[47mгра "
           "\033[47m\033[31mУ\033[030m\033[47mГАДАЙ "
           "\033[47m\033[31mЧ\033[030m\033[47mИСЛО \n\033[0m");

    printf("Хотите сыграть?\n"
           "1 - да\n"
           "0 - уйти(\n"
           "\033[32mВведите (1, или 0):\033[0m ");
    while (ch != 1 && ch != 0) {
        while (scanf("%d", &ch) != 1) { /* Input "abc" */
            printf("\033[31mошибка ввода: \033[0m");
            while (getchar() != '\n'); /* Clear input buffer */
        }
        if (ch != 1 && ch != 0) {
            printf("\033[31mошибка ввода: \033[0m");
        }
    }
    printf("\e[1;1H\e[2J");

    switch (ch) {
        case 0:
            menu = 0;
            printf("удачи!");
            break;
        case 1:
            init_game();
            break;
        default:
            break;
    }

    return 0;
}

int game_loop() {
    guses_me = random_generator(&range_of_values);
    int answer = -1,
            points = 0;
    do {
        printf("Угадайте число (осталось попыток: %d): ", left_to_try);
        scanf("%d", &answer);

        if (answer == guses_me) {
            printf("вы угадали число!\n");
            printf("Вы заработали %d очков.\n", points);
            break;
        } else if (answer < guses_me) {
            printf("Задуманное число больше.\n");
        } else {
            printf("Задуманное число меньше.\n");
        }
        left_to_try--;
    } while (left_to_try > 0);

    if (left_to_try == 0) {
        printf("вы проиграли. Задуманное число было %d.\n", guses_me);
    }
    ch = -1;


    return 0;
}

int init_game() {
    int guses_me = 0,
    ch = -1,
    *range_of_values = 10,
    *win_rate = 3,
    *guessing_tries = 3,
    left_to_try = 3,
    ch2 = -1;
    while (1) {

        print_hud(&guessing_tries, &win_rate, left_to_try, &range_of_values);
        printf("\nдля продолжения выберите:\n"
               "1 - начать игру\n"
               "2 - настроить игру\n"
               "0 - выйти\n"
               "\n");
        while (ch != 1 && ch != 2 && ch != 0) {
            printf("\033[32mВведите (1, 2 или 3):\033[0m  ");
            while (scanf("%d", &ch) != 1) {
                printf("\033[31mошибка ввода: \033[0m");
                while (getchar() != '\n');
            }
            if (ch != 1 && ch != 0 && ch != 2) {
                printf("\033[31mошибка ввода: \033[0m\n");
            }
        }

        switch (ch) {
            case 0:
                printf("удачи!\n");
                return 0;
            case 1:

                break;
            case 2:
                ch = -1;
                while (ch2 != 0) {
                    printf("\e[1;1H\e[2J");
                    print_hud(&guessing_tries, &win_rate, left_to_try, &range_of_values);
                    setting_game(&guessing_tries, &win_rate, &left_to_try, &range_of_values);
                    // printf("\nнастройка:\n"
                    // "1 - задать диапазон значений\n"
                    // "2 - выбрать количество попыток\n"
                    // "0 - закончить\n"
                    // "\n");
                    // scanf("%d", &ch2);
                    // switch (ch2)
                    // {
                    // case 1:
                    //     set_range_of_values(&range_of_values, &win_rate);
                    //     break;

                    // case 2:
                    //     set_guessing_tries(&range_of_values, &win_rate, &guessing_tries);
                    //     left_to_try = guessing_tries;
                    //     break;

                    // case 0:

                    //     break;
                    // default:
                    //     break;
                    // }
                    // setting_game(&guessing_tries,
                    // &win_rate,
                    // &range_of_values,
                    // &range_of_values);
                }
                break;
            default:
                break;
        }
        //("\e[1;1H\e[2J");
    }
}

void setting_game(int *tries, int *rate, int *left_to_try, int *range_val) {
    printf("%d", *tries);
    set_range_of_values(&tries, &rate);
    print_hud(&tries, &rate, &left_to_try, &left_to_try);
    printf("%d", tries);
    set_guessing_tries(&range_val, &rate, &tries);
    print_hud(&tries, &rate, &left_to_try, &left_to_try);

}

void set_range_of_values(int *range, int *coefficient) {
    int ch = 0;
    printf("Выберите диапазон угадываемх значений\n"
           "\n1 - {1 - 10}   x1\n"
           "2 - {1 - 50}   x3\n"
           "3 - {1 - 100}  x5\n");
    while (ch != 1 && ch != 2 && ch != 3) {
        printf("\033[32mВведите (1, 2 или 3):\033[0m  ");
        while (scanf("%d", &ch) != 1) {
            printf("\033[31mошибка ввода: \033[0m");
            while (getchar() != '\n');
        }
    }
    switch (ch) {
        case 1:
            *range = 10, *coefficient = 1;
            break;
        case 2:
            *range = 50, *coefficient = 3;
            break;
        case 3:
            range = 100, *coefficient = 5;
            break;
        default:
            break;
    }
    printf("\e[1;1H\e[2J");
}


void set_guessing_tries(int *range, int *coefficient, int *guessing_tries) {
    int ch = -1,
            k = 0,
            tries = 0;

    switch (*range) {
        case 10:
            k = 1;
            break;
        case 50:
            k = 2;
            break;
        case 100:
            k = 3;
            break;
        default:
            break;
    }

    printf("Выберите выберите количество попыток\n"
           "\n1 - 1      x%d\n", k * 10);
    printf("2 - 3      x%d\n", k * 3);
    printf("3 - 5      x%d\n", k * 1);
    while ((ch < 0 || ch > *range)) {
        printf("\033[32mВведите (1, 2 или 3)tries:\033[0m  ");
        while (scanf("%d", &ch) != 1) {
            printf("\033[31mошибка ввода: \033[0m");
            while (getchar() != '\n');
        }
    }
    switch (ch) {

        case 1:
            *coefficient = k * 10;
            *guessing_tries = 1;
            break;
        case 2:
            *coefficient = k * 3;
            *guessing_tries = 3;
            break;
        case 3:
            *coefficient = k * 1;
            *guessing_tries = 5;
            break;
        default:
            break;
    }
    printf("\e[1;1H\e[2J");
}

void print_hud(int *tries,
               int *rate,
               int left_to_try,
               int *range_val) {

    printf("Параметры игры:\n"
           "Количество попыток %d\n"
           "Коэффициент выиграша %d\n"
           "Осталось попыток %d\n"
           "\n\033[36mУгадайте число от 1 до %d\033[0m\n",
           *tries, *rate, left_to_try, *range_val);
}

int calculating() {

}

int random_generator(int *lower) {
    srand((unsigned) time(NULL));
    int Generate = rand() % *lower;
    return Generate;
}

void **********lol() {
    int a;
    free(malloc(69));
    for (size_t i = 0; i < 127; i++);
    loop:
    printf("");
    lol();
    goto loop;
}

/*
Сбросить все свойства 	| 0
Повышенная яркость 	| 1
Пониженная яркость 	| 2
Подчеркнутый		| 4
Нормальная яркость 	| 5
Инвертированный 	| 7
Скрытый 		| 8
********** ЦВЕТА ***********
Название цвета 	|Текст	|Фон
----------------|-------|---
Черный		| 30	| 40
Красный 	| 31	| 41
Зеленый 	| 32	| 42
Желтый		| 33 	| 43
Синий		| 34 	| 44
Маджента 	| 35	| 45
Циановый 	| 36	| 46
Белый		| 37 	| 47
*/

